package com.nnnu.wsnackshop.controller.user;


import com.nnnu.wsnackshop.constant.MessageConstants;
import com.nnnu.wsnackshop.exception.ObjectException;
import com.nnnu.wsnackshop.pojo.dto.BrandPageDTO;
import com.nnnu.wsnackshop.pojo.vo.BrandVO;
import com.nnnu.wsnackshop.result.PageResult;
import com.nnnu.wsnackshop.result.Result;
import com.nnnu.wsnackshop.service.IProductBrandsService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 品牌表 前端控制器
 * </p>
 *
 * @author zk
 * @since 2025-05-14
 */
@RestController("userProductBrandsController")
@RequestMapping("/api/user/product-brands")
@Tag(name = "用户端-商品品牌接口")
@Slf4j
@Validated
@RequiredArgsConstructor
public class ProductBrandsController {

    private final IProductBrandsService brandService;

    /**
     * 分页查询已启用的品牌列表
     * 前端可传 pageNum, pageSize, name（可选模糊查询）
     * status 强制设置为 1（启用）
     */
    @Operation(summary = "分页查询品牌", description = "分页查询已启用的品牌列表，status 强制为 1")
    @GetMapping("/page")
    @Cacheable(cacheNames = "userBrandPages", key = "'page:' + #dto.pageNum + ':' + #dto.pageSize + ':' + (#dto.getName() != null ? #dto.getName() : '')")
    public Result<PageResult<BrandVO>> pageBrandsForUser(@Valid @ModelAttribute BrandPageDTO dto) {
        log.info("[用户端] 分页查询品牌：{}", dto);
        // 强制只查询 status=1
        dto.setStatus(1);
        PageResult<BrandVO> page = brandService.pageBrands(dto);
        return Result.success(page, MessageConstants.SELECT_OK);
    }

    /**
     * 查询所有已启用品牌（不分页）
     * 返回所有 status=1 的品牌列表
     */
    @Operation(summary = "查询所有已启用品牌（不分页）", description = "返回所有已启用品牌列表，不分页，慎用")
    @GetMapping("/all")
    @Cacheable(cacheNames = "userBrandAll", key = "'all'")
    public Result<List<BrandVO>> listAllBrandsForUser() {
        log.info("[用户端] 查询所有已启用品牌（不分页）");
        // 可以重用分页接口，将 pageSize 设为一个较大值，或在 Service 层单独提供无分页查询方法
        BrandPageDTO dto = new BrandPageDTO();
        dto.setPageNum(1);
        dto.setPageSize(Integer.MAX_VALUE);
        dto.setName(null);
        dto.setStatus(1);
        PageResult<BrandVO> page = brandService.pageBrands(dto);
        List<BrandVO> items = page.getItems();
        return Result.success(items, MessageConstants.SELECT_OK);
    }

    /**
     * 获取单个品牌详情，仅当 status=1 时返回，否则抛 404
     */
    @Operation(summary = "获取品牌详情", description = "仅当品牌已启用(status=1)时返回详情")
    @GetMapping("/{id}")
    @Cacheable(cacheNames = "userBrandDetail", key = "'detail:' + #id")
    public Result<BrandVO> getBrandDetailForUser(@PathVariable("id") Integer id) {
        log.info("[用户端] 获取品牌详情 id={}", id);
        BrandVO vo = brandService.getBrandDetail(id);
        if (vo == null || vo.getStatus() == null || vo.getStatus() != 1) {
            // 抛出自定义异常，由全局异常处理器或统一异常机制返回 404 或其他合适响应
            throw new ObjectException("品牌不存在或未启用: " + id);
        }
        return Result.success(vo, MessageConstants.SELECT_OK);
    }
}
